package util;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @author admin
 * @Description 存在重复元素
 * @date 2020-06-29 18:45:00
 */
public class ExistRepeatElement {

    public static void main(String[] args) {
        // 存在重复元素
        int[] integers = new int[]{1, 2, 3, 4, 1, 1, 2};
        System.out.println(containsDuplicate1(integers));
        System.out.println(containsDuplicate2(integers));
        System.out.println(containsDuplicate3(integers));
    }

    /**
     * (哈希表)
     *
     * @param nums 数组
     * @return 重复T不重复F
     */
    public static boolean containsDuplicate1(int[] nums) {
        Set<Integer> set = new HashSet<>(nums.length);
        for (int x : nums) {
            if (set.contains(x)) {
                return true;
            }
            // 不添加重复元素(如果遇到时会直接退出)
            set.add(x);
        }
        return false;
    }

    /**
     * (堆排序)
     *
     * @param nums 数组
     * @return 重复T不重复F
     */
    public static boolean containsDuplicate2(int[] nums) {
        Arrays.sort(nums);
        for (int i = 0; i < nums.length - 1; ++i) {
            if (nums[i] == nums[i + 1]) {
                return true;
            }
        }
        return false;
    }

    /**
     * 循环不变式(在下一次搜索之前,搜索过的整数中没有重复的整数)
     *
     * @param nums 数组
     * @return 重复T不重复F
     */
    public static boolean containsDuplicate3(int[] nums) {
        for (int i = 0; i < nums.length; ++i) {
            for (int j = 0; j < i; ++j) {
                if (nums[j] == nums[i]) {
                    return true;
                }
            }
        }
        return false;
    }

}
